package com.hy.video.monitor.config;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.annotation.Validated;

import javax.validation.Valid;
import javax.validation.constraints.Min;

@Validated
@Configuration
@ConfigurationProperties(prefix = "mooc")
public class AppProperties {
    @Getter
    @Setter
    @Valid
    private Jwt jwt = new Jwt();

    @Getter
    @Setter
    @Valid
    private SmsProvider smsProvider = new SmsProvider();

    @Getter
    @Setter
    @Valid
    private EmailProvider emailProvider = new EmailProvider();

    @Getter
    @Setter
    @Valid
    private LeanCloud leanCloud = new LeanCloud();

    @Getter
    @Setter
    @Valid
    private Ali ali = new Ali();


    @Getter
    @Setter
    public static class Jwt {

        private String header = "Authorization"; // HTTP 报头的认证字段的 key

        private String prefix = "Bearer "; // HTTP 报头的认证字段的值的前缀

        /**
         * access_token 和 refresh_token 的有效时间如何设置?
         *  为了保证能够刷新活跃用户的access_token ， refresh_token 的有效时间 不能小于 用户活跃时间点
         *  假设 access_token 有效时间是 et ，那么用户在 [ access_token 起始时间点 ，2*et ] 时间内用户
         *  是活跃的 ，由此可知 refresh_token 的有效时间 >= 2 * access_token 的有效时间.
         *  一般,refresh_token 的有效时间 > 2 * access_token 的有效时间
         *
         * 比如，access_token 实效7天，那么 refresh_token 实效可以给15天,也可以给30天
         * 当然，access_token和refresh_token 的时长具体多少，需要根据环境决定，如涉及到金钱的
         * 银行客户端，12306客户端等 token时长都很短，而普通app客户端的token可以是几天甚至上月.
         */
        @Min(5000L)
        //private long accessTokenExpireTime = 120 * 1000L; // Access Token 过期时间 2分钟
        private long accessTokenExpireTime = 1800000L; // 开发期间 Access Token 过期时间 30分钟

        @Min(3600000L)
        private long refreshTokenExpireTime = 30 * 24 * 3600 * 1000L; // Refresh Token 过期时间 30天

        private String key;

        private String refreshKey;
    }


    @Getter
    @Setter
    public static class LeanCloud {
        private String appId;
        private String appKey;
    }

    @Getter
    @Setter
    public static class Ali {
        private String apiKey;
        private String apiSecret;
    }

    @Getter
    @Setter
    public static class SmsProvider {
        private String name;
        private String apiUrl;
    }

    @Getter
    @Setter
    public static class EmailProvider {
        private String name;
        private String apiKey;
    }
}
